package org.convallaria.framework.common.constants.sys;

/**
 * 系统参数配置相关常量
 * 
 * 功能特性：
 * - 定义配置类型常量
 * - 定义配置字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class ConfigConstants {

    private ConfigConstants() {
        // 防止实例化
    }

    // ==================== 配置类型常量 ====================

    /**
     * 系统内置配置
     */
    public static final String CONFIG_TYPE_SYSTEM = "Y";

    /**
     * 用户自定义配置
     */
    public static final String CONFIG_TYPE_USER = "N";

    // ==================== 配置字段长度限制 ====================

    /**
     * 配置名称最大长度
     */
    public static final int CONFIG_NAME_MAX_LENGTH = 100;

    /**
     * 配置键名最大长度
     */
    public static final int CONFIG_KEY_MAX_LENGTH = 100;

    /**
     * 配置键值最大长度
     */
    public static final int CONFIG_VALUE_MAX_LENGTH = 500;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 配置类型描述 ====================

    /**
     * 配置类型描述映射
     */
    public static final String[] CONFIG_TYPE_DESCRIPTIONS = {
        "用户自定义", "系统内置"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认配置类型
     */
    public static final String DEFAULT_CONFIG_TYPE = CONFIG_TYPE_USER;

    // ==================== 业务规则常量 ====================

    /**
     * 配置键名正则表达式（字母、数字、下划线、连字符、点号）
     */
    public static final String CONFIG_KEY_PATTERN = "^[a-zA-Z0-9._-]+$";

    /**
     * 配置名称正则表达式（中文、字母、数字、下划线、连字符、空格、括号）
     */
    public static final String CONFIG_NAME_PATTERN = "^[\\u4e00-\\u9fa5a-zA-Z0-9_\\-\\s()（）]+$";

    /**
     * 系统内置配置键名前缀
     */
    public static final String SYSTEM_CONFIG_KEY_PREFIX = "sys.";

    /**
     * 用户配置键名前缀
     */
    public static final String USER_CONFIG_KEY_PREFIX = "user.";

    // ==================== 常用配置键名常量 ====================

    /**
     * 系统名称配置键
     */
    public static final String CONFIG_KEY_SYSTEM_NAME = "sys.system.name";

    /**
     * 系统版本配置键
     */
    public static final String CONFIG_KEY_SYSTEM_VERSION = "sys.system.version";

    /**
     * 系统描述配置键
     */
    public static final String CONFIG_KEY_SYSTEM_DESCRIPTION = "sys.system.description";

    /**
     * 系统Logo配置键
     */
    public static final String CONFIG_KEY_SYSTEM_LOGO = "sys.system.logo";

    /**
     * 系统版权配置键
     */
    public static final String CONFIG_KEY_SYSTEM_COPYRIGHT = "sys.system.copyright";

    /**
     * 系统联系邮箱配置键
     */
    public static final String CONFIG_KEY_SYSTEM_EMAIL = "sys.system.email";

    /**
     * 系统联系电话配置键
     */
    public static final String CONFIG_KEY_SYSTEM_PHONE = "sys.system.phone";

    /**
     * 系统地址配置键
     */
    public static final String CONFIG_KEY_SYSTEM_ADDRESS = "sys.system.address";

    // ==================== 工具方法 ====================

    /**
     * 获取配置类型描述
     * 
     * @param configType 配置类型
     * @return 配置类型描述
     */
    public static String getConfigTypeDesc(String configType) {
        if (CONFIG_TYPE_USER.equals(configType)) {
            return CONFIG_TYPE_DESCRIPTIONS[0];
        } else if (CONFIG_TYPE_SYSTEM.equals(configType)) {
            return CONFIG_TYPE_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证配置类型是否有效
     * 
     * @param configType 配置类型
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigType(String configType) {
        return CONFIG_TYPE_USER.equals(configType) || CONFIG_TYPE_SYSTEM.equals(configType);
    }

    /**
     * 验证配置名称是否有效
     * 
     * @param configName 配置名称
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigName(String configName) {
        if (configName == null || configName.trim().isEmpty()) {
            return false;
        }
        if (configName.length() > CONFIG_NAME_MAX_LENGTH) {
            return false;
        }
        return configName.matches(CONFIG_NAME_PATTERN);
    }

    /**
     * 验证配置键名是否有效
     * 
     * @param configKey 配置键名
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigKey(String configKey) {
        if (configKey == null || configKey.trim().isEmpty()) {
            return false;
        }
        if (configKey.length() > CONFIG_KEY_MAX_LENGTH) {
            return false;
        }
        return configKey.matches(CONFIG_KEY_PATTERN);
    }

    /**
     * 验证配置键值是否有效
     * 
     * @param configValue 配置键值
     * @return true=有效，false=无效
     */
    public static boolean isValidConfigValue(String configValue) {
        if (configValue == null) {
            return true; // 配置键值可以为空
        }
        return configValue.length() <= CONFIG_VALUE_MAX_LENGTH;
    }

    /**
     * 验证配置信息是否完整
     * 
     * @param configName 配置名称
     * @param configKey 配置键名
     * @param configType 配置类型
     * @return true=完整，false=不完整
     */
    public static boolean isValidConfigInfo(String configName, String configKey, String configType) {
        return isValidConfigName(configName) 
            && isValidConfigKey(configKey) 
            && isValidConfigType(configType);
    }

    /**
     * 判断是否为系统内置配置
     * 
     * @param configType 配置类型
     * @return true=系统内置，false=用户自定义
     */
    public static boolean isSystemConfig(String configType) {
        return CONFIG_TYPE_SYSTEM.equals(configType);
    }

    /**
     * 判断是否为用户自定义配置
     * 
     * @param configType 配置类型
     * @return true=用户自定义，false=系统内置
     */
    public static boolean isUserConfig(String configType) {
        return CONFIG_TYPE_USER.equals(configType);
    }

    /**
     * 判断配置键名是否为系统配置
     * 
     * @param configKey 配置键名
     * @return true=系统配置，false=用户配置
     */
    public static boolean isSystemConfigKey(String configKey) {
        if (configKey == null || configKey.trim().isEmpty()) {
            return false;
        }
        return configKey.startsWith(SYSTEM_CONFIG_KEY_PREFIX);
    }

    /**
     * 判断配置键名是否为用户配置
     * 
     * @param configKey 配置键名
     * @return true=用户配置，false=系统配置
     */
    public static boolean isUserConfigKey(String configKey) {
        if (configKey == null || configKey.trim().isEmpty()) {
            return false;
        }
        return configKey.startsWith(USER_CONFIG_KEY_PREFIX);
    }

    /**
     * 格式化配置键名（添加前缀）
     * 
     * @param configKey 原始配置键名
     * @param isSystem 是否为系统配置
     * @return 格式化后的配置键名
     */
    public static String formatConfigKey(String configKey, boolean isSystem) {
        if (configKey == null || configKey.trim().isEmpty()) {
            return "";
        }
        
        String prefix = isSystem ? SYSTEM_CONFIG_KEY_PREFIX : USER_CONFIG_KEY_PREFIX;
        if (configKey.startsWith(prefix)) {
            return configKey;
        }
        
        return prefix + configKey;
    }

    /**
     * 清理配置键名（移除前缀）
     * 
     * @param configKey 原始配置键名
     * @return 清理后的配置键名
     */
    public static String cleanConfigKey(String configKey) {
        if (configKey == null || configKey.trim().isEmpty()) {
            return "";
        }
        
        if (configKey.startsWith(SYSTEM_CONFIG_KEY_PREFIX)) {
            return configKey.substring(SYSTEM_CONFIG_KEY_PREFIX.length());
        }
        if (configKey.startsWith(USER_CONFIG_KEY_PREFIX)) {
            return configKey.substring(USER_CONFIG_KEY_PREFIX.length());
        }
        
        return configKey;
    }

    /**
     * 清理配置名称（去除多余空格）
     * 
     * @param configName 原始配置名称
     * @return 清理后的配置名称
     */
    public static String cleanConfigName(String configName) {
        if (configName == null) {
            return "";
        }
        return configName.trim().replaceAll("\\s+", " ");
    }
}
